| throwing (1) | void* operator new (std::size_t size) throw (std::bad_alloc); |
|---|---|
| nothrow (2) | void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw(); |
| placement (3) | void* operator new (std::size_t size, void* ptr) throw(); |
| throwing (1) | void* operator new (std::size_t size); |
|---|---|
| nothrow (2) | void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept; |
| placement (3) | void* operator new (std::size_t size, void* ptr) noexcept; |
::operator new (size).operator new are declared in the global namespace, not within the std namespace.<new> is included or not.operator new can be called explicitly as a regular function, but in C++, new is an operator with a very specific behavior: An expression with the new operator, first calls function operator new (i.e., this function) with the size of its type specifier as first argument, and if this is successful, it then automatically initializes or constructs the object (if needed). Finally, the expression evaluates as a pointer to the appropriate type.operator new, operator new returns a null-pointer on failure instead of throwing a bad_alloc exception.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// operator new example
#include <iostream> // std::cout
#include <new> // ::operator new
struct MyClass {
int data[100];
MyClass() {std::cout << "constructed [" << this << "]\n";}
};
int main () {
std::cout << "1: ";
MyClass * p1 = new MyClass;
// allocates memory by calling: operator new (sizeof(MyClass))
// and then constructs an object at the newly allocated space
std::cout << "2: ";
MyClass * p2 = new (std::nothrow) MyClass;
// allocates memory by calling: operator new (sizeof(MyClass),std::nothrow)
// and then constructs an object at the newly allocated space
std::cout << "3: ";
new (p2) MyClass;
// does not allocate memory -- calls: operator new (sizeof(MyClass),p2)
// but constructs an object at p2
// Notice though that calling this function directly does not construct an object:
std::cout << "4: ";
MyClass * p3 = (MyClass*) ::operator new (sizeof(MyClass));
// allocates memory by calling: operator new (sizeof(MyClass))
// but does not call MyClass's constructor
delete p1;
delete p2;
delete p3;
return 0;
}
1: constructed [0x8f0f70] 2: constructed [0x8f23a8] 3: constructed [0x8f23a8] 4: